﻿Imports System.Data.SqlClient
Imports DTO

Public Class FornecedorDAL

#Region "Métodos"
    ''' <summary>
    ''' Método responsável incluir um fornecedor na base de dados
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Incluir(fornecedor As FornecedorDTO)
        Dim strSql As String
        Using conn As New SqlConnection(My.Settings.Conexao)

            'Cria a string de execução da procedure
            strSql = "EXEC PR_INSERIR_Fornecedor " & _
                     " @Cnpj ,@RazaoSocial ,@Email ,@Logradouro ,@Complemento ,@Numero ,@Bairro	" & _
                     " ,@Cidade	 ,@Estado ,@Cep ,@DddCelular ,@NumeroCelular ,@DddTelefone	,@NumeroTelefone"

            Using cmd As New SqlCommand(strSql, conn)
                Try
                    'Cria os parâmetros de execução
                    cmd.Parameters.Add("@RazaoSocial", SqlDbType.VarChar, 200).Value = fornecedor.pRazaoSocial
                    cmd.Parameters.Add("@Cnpj", SqlDbType.VarChar, 14).Value = fornecedor.pCnpj
                    cmd.Parameters.Add("@Email", SqlDbType.VarChar, 100).Value = fornecedor.pEmail

                    'Objeto EnderecoDTO
                    cmd.Parameters.Add("@Logradouro", SqlDbType.VarChar, 150).Value = fornecedor.pEndereco.pLogradouro
                    cmd.Parameters.Add("@Numero", SqlDbType.Char, 5).Value = fornecedor.pEndereco.pNumero
                    cmd.Parameters.Add("@Bairro", SqlDbType.VarChar, 50).Value = fornecedor.pEndereco.pBairro
                    cmd.Parameters.Add("@Cidade", SqlDbType.VarChar, 100).Value = fornecedor.pEndereco.pCidade
                    cmd.Parameters.Add("@Estado", SqlDbType.Char, 2).Value = fornecedor.pEndereco.pEstado
                    cmd.Parameters.Add("@Cep", SqlDbType.Char, 8).Value = fornecedor.pEndereco.pCep
                    cmd.Parameters.Add("@Complemento", SqlDbType.VarChar, 20).Value = fornecedor.pEndereco.pComplemento

                    'Objeto TefoneDTO
                    cmd.Parameters.Add("@DddCelular", SqlDbType.Char, 2).Value = fornecedor.pTelefone.pDdd
                    cmd.Parameters.Add("@NumeroCelular", SqlDbType.VarChar, 10).Value = fornecedor.pTelefone.pNumero


                    conn.Open() 'Abrir a conexao
                    cmd.ExecuteNonQuery() 'Executa o SQL

                Catch ex As SqlException
                    'Erro nº 2627 do SQLException indica chave primaria duplicada
                    If ex.Number = 2627 Then
                        Throw New Exception("Já existe um cliente com este CNPJ cadastrado!")
                    Else
                        Throw ex
                    End If
                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Sub

    ''' <summary>
    ''' Método utilizado para alterar um determinado fornecedor através de seu CNPJ
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Alterar(fornecedor As FornecedorDTO)
        Dim strSql As String
        Using conn As New SqlConnection(My.Settings.Conexao)

            'Cria a string de execução da procedure
            strSql = "EXEC PR_ALTERAR_FORNECEDOR " & _
                     " @Cnpj, @RazaoSocial, @Logradouro, @Numero, @Bairro, @Cidade, @Complemento, @Email" & _
                     " @Estado, @Cep, @DddCelular, @NumeroCelular, @DddTelefone, @NumeroTelefone"

            Using cmd As New SqlCommand(strSql, conn)
                Try
                    'Cria os parâmetros de execução
                    cmd.Parameters.Add("@RazaoSocial", SqlDbType.VarChar, 200).Value = fornecedor.pRazaoSocial
                    cmd.Parameters.Add("@Cnpj", SqlDbType.VarChar, 11).Value = fornecedor.pCnpj
                    cmd.Parameters.Add("@Email", SqlDbType.VarChar, 100).Value = fornecedor.pEmail

                    'Objeto EnderecoDTO
                    cmd.Parameters.Add("@Logradouro", SqlDbType.VarChar, 150).Value = fornecedor.pEndereco.pLogradouro
                    cmd.Parameters.Add("@Numero", SqlDbType.Char, 5).Value = fornecedor.pEndereco.pNumero
                    cmd.Parameters.Add("@Bairro", SqlDbType.VarChar, 50).Value = fornecedor.pEndereco.pBairro
                    cmd.Parameters.Add("@Cidade", SqlDbType.VarChar, 100).Value = fornecedor.pEndereco.pCidade
                    cmd.Parameters.Add("@Estado", SqlDbType.Char, 2).Value = fornecedor.pEndereco.pEstado
                    cmd.Parameters.Add("@Cep", SqlDbType.Char, 8).Value = fornecedor.pEndereco.pCep
                    cmd.Parameters.Add("@Complemento", SqlDbType.VarChar, 20).Value = fornecedor.pEndereco.pComplemento

                    'Objeto TefoneDTO
                    cmd.Parameters.Add("@DddTelefone", SqlDbType.Char, 2).Value = fornecedor.pTelefone.pDdd
                    cmd.Parameters.Add("@NumeroTelefone", SqlDbType.VarChar, 10).Value = fornecedor.pTelefone.pNumero

                    conn.Open() 'Abrir a conexao
                    cmd.ExecuteNonQuery() 'Executa o SQL

                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Sub

    ''' <summary>
    ''' Método utilizado para excluir o fornecedor passando como parâmetro o CNPJ
    ''' </summary>
    ''' <param name="cnpj"></param>
    ''' <remarks></remarks>
    Public Sub Excluir(cnpj As String)
        Dim strSql As String
        Using conn As New SqlConnection(My.Settings.Conexao)

            'Cria a string de execução da procedure
            strSql = "EXEC PR_EXCLUIR_FORNECEDOR " & _
                     " @Cnpj"

            Using cmd As New SqlCommand(strSql, conn)
                Try
                    'Cria os parâmetros de execução
                    cmd.Parameters.Add("@Cnpj", SqlDbType.VarChar, 11).Value = cnpj

                    conn.Open() 'Abrir a conexao
                    cmd.ExecuteNonQuery() 'Executa o SQL

                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Sub

    ''' <summary>
    ''' Método responsável por listar fornecedores
    ''' </summary>
    ''' <param name="cnpj"></param>
    ''' <remarks></remarks>
    Public Function Consultar(cnpj As String) As FornecedorDTO
        Dim reader As SqlDataReader
        Dim strSql As String
        Dim objFornecedor As New FornecedorDTO
        Try
            Using conn As New SqlConnection(My.Settings.Conexao)
                strSql = "SELECT * FROM Fornecedor WHERE Cnpj=@Cnpj AND Ativo=1"
                Using cmd As New SqlCommand(strSql, conn)
                    cmd.Parameters.Add("@Cnpj", SqlDbType.VarChar, 11).Value = cnpj

                    conn.Open()
                    reader = cmd.ExecuteReader

                    'Se ele encontrou algum registro, preenche o objeto
                    If reader.Read() Then
                        objFornecedor.pRazaoSocial = reader.Item("RazaoSocial")
                        objFornecedor.pCnpj = reader.Item("cnpj")
                        objFornecedor.pEndereco.pBairro = reader.Item("Bairro")
                        objFornecedor.pEndereco.pCep = reader.Item("Cep")
                        objFornecedor.pEndereco.pCidade = reader.Item("Cidade")
                        objFornecedor.pEndereco.pComplemento = reader.Item("Complemento")
                        objFornecedor.pEndereco.pEstado = reader.Item("Estado")
                        objFornecedor.pEndereco.pLogradouro = reader.Item("Logradouro")
                        objFornecedor.pEndereco.pNumero = reader.Item("Numero")
                        objFornecedor.pTelefone.pDdd = reader.Item("DddTelefone")
                        objFornecedor.pTelefone.pNumero = reader.Item("NumeroTelefone")
                    End If
                    reader.Close()

                End Using
            End Using
            Return objFornecedor
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    ''' <summary>
    ''' Método responsável por listar todos os fornecedores existentes e ativos
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Listar() As List(Of FornecedorDTO)
        Dim strSQL As String
        Dim reader As SqlDataReader
        Dim fornecedor As FornecedorDTO
        Dim listaFornecedor As New List(Of FornecedorDTO)


        Using conn As New SqlConnection(My.Settings.Conexao)
            'conn.ConnectionString = My.Settings.StringConexao
            strSQL = "SELECT * FROM Fornecedor WHERE Ativo=1"

            Using cmd As New SqlCommand(strSQL, conn)
                Try
                    'Cria parâmetro

                    conn.Open() 'Abre conexão

                    reader = cmd.ExecuteReader

                    Do While reader.Read
                        'Instacia um novo objeto clsCliente e preenche este obj com info do bd
                        fornecedor = New FornecedorDTO

                        With fornecedor
                            .pRazaoSocial = reader.Item("RazaoSocial")
                            .pCnpj = reader.Item("cnpj")
                            .pEndereco.pBairro = reader.Item("Bairro")
                            .pEndereco.pCep = reader.Item("Cep")
                            .pEndereco.pCidade = reader.Item("Cidade")
                            .pEndereco.pComplemento = reader.Item("Complemento")
                            .pEndereco.pEstado = reader.Item("Estado")
                            .pEndereco.pLogradouro = reader.Item("Logradouro")
                            .pEndereco.pNumero = reader.Item("Numero")
                            .pTelefone.pDdd = reader.Item("DddTelefone")
                            .pTelefone.pNumero = reader.Item("NumeroTelefone")
                        End With

                        'adicionar na lista
                        listaFornecedor.Add(fornecedor)

                    Loop
                    'fecha o cursos
                    reader.Close()

                    Return listaFornecedor

                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Function
#End Region

End Class
